package main

import (
	"fmt"
	"strconv"
)

/*
strconv是golang用来做数据类型转换的一个库。
*/

func main() {
	format()
	parse()
	tes2t()
}

/*
其他类型转换为字符串
AppendInt
AppendUint
AppendFloat
AppendBool
*/
func format()  {
	b := []byte("bool:")
	b = strconv.AppendBool(b, true)
	fmt.Println(string(b))

	b32 := []byte("float32:")
	b32 = strconv.AppendFloat(b32, 3.1415926535, 'E', -1, 32)
	fmt.Println(string(b32))

	b10 := []byte("int (base 10):")
	b10 = strconv.AppendInt(b10, -42, 10)
	fmt.Println(string(b10))

	b16 := []byte("uint (base 16):")
	b16 = strconv.AppendUint(b16, 42, 16)
	fmt.Println(string(b16))

	//bool转string
	strBool := strconv.FormatBool(false)
	/*
	浮点数转string
	func FormatFloat(f float64, fmt byte, prec, bitSize int) string
	f：要转换的浮点数
	fmt：格式标记（b、e、E、f、g、G）
	prec：精度（数字部分的长度，不包括指数部分）
	bitSize：指定浮点类型（32:float32、64:float64），结果会据此进行舍入。

	格式标记：
	‘b’ (-ddddp±ddd，二进制指数)
	‘e’ (-d.dddde±dd，十进制指数)
	‘E’ (-d.ddddE±dd，十进制指数)
	‘f’ (-ddd.dddd，没有指数)
	‘g’ (‘e’:大指数，’f’:其它情况)
	‘G’ (‘E’:大指数，’f’:其它情况)

	如果格式标记为 ‘e’，’E’和’f’，则 prec 表示小数点后的数字位数
	如果格式标记为 ‘g’，’G’，则 prec 表示总的数字位数（整数部分+小数部分
	*/
	strFloat := strconv.FormatFloat(3.1415926535,'f',3,32)

	//base 表示转换进制，取值在 2 到 36 之间
	strInt := strconv.FormatInt(66,2)
	strInt2 := strconv.FormatUint(66,16)

	fmt.Println(strBool,strFloat,strInt,strInt2)

	//FormatInt(i, 10) 的简写
	strInt3 := strconv.Itoa(66)
	//ParseInt(s, 10, 0) 的简写）
	toInt3 , _:= strconv.Atoi("66")
	fmt.Println(strInt3, toInt3)
}

/*
字符串转换为其他类型
*/
func parse()  {
	/*
	布尔值
	它接受真值：1, t, T, TRUE, true, True
	它接受假值：0, f, F, FALSE, false, False
	*/
	toBool, err := strconv.ParseBool("false")
	toBool2, _ := strconv.ParseBool("F")
	fmt.Println(toBool, err, toBool2)

	//浮点数,分32和64两种 （会丢失精度）
	toFloat1, _ := strconv.ParseFloat("1234.56", 32)
	toFloat2, _ := strconv.ParseFloat("12345.67891", 64)
	fmt.Println(toFloat1, toFloat2)

	/*
	正数
	ParseInt 支持正负号，ParseUint 不支持正负号
	base 表示进位制（2 到 36）(base 为 0，则根据字符串前缀判断)
	bitSize 表示结果的位宽（包括符号位），0 表示最大位宽。
	*/
	toInt1, _ := strconv.ParseInt("123456", 10,0)
	toInt2, _ := strconv.ParseUint("123456", 10,0)
	fmt.Println(toInt1, toInt2)
}

func tes2t()  {
	fmt.Println(strconv.CanBackquote("Fran & Freddie's Diner ☺"))
	fmt.Println(strconv.CanBackquote("`can't backquote this`"))
}

